import logging

import pandas as pd

from pandas import Series
from pandas.core.interchange.dataframe_protocol import DataFrame
from DB_Basic import DbBasic

# from tools import _get_files_name as get_files_name
# from tools import BASE_PATH_企业级应用课设
from tools.datetime_tools import convert_mmdd_to_date
from tools.ml_tools import calculate_date_scores

# from file import get_files_name
# from file import check_filename_format, has_duplicates

logging.basicConfig(
    level=logging.DEBUG,
    format='%(levelname)8s: %(message)s'
)

文档 = '([^-\.]+)'
班级 = '([^-\.]+)'
学号 = '([0-9]{11})'
姓名 = '([^-\.]+)'
日期 = '([0-9]{4})'
后缀 = '([^-\.]+)'

BASE_PATH = r"D:\100-Project\2025-2026-1学期安排\首义学院\19201018_《软件工程综合实践（创新创业）（企业）》"
FOLDER_PATH = f"{BASE_PATH}\学生提交\实习报告"
FILE_TYPES = ['.doc', '.docx']
PATTERN_报告 = f'^{文档}-{班级}-{学号}-{姓名}.{日期}.{后缀}$'
OUTPUT_FILE = f"{BASE_PATH}\学生提交\输出\报告结果.xlsx"

STU_NAME_SHEET_FILE = f"{BASE_PATH}\学生提交\学生名单.xlsx"
DB_FILE = f"sqlite/data.db"


def calc_实践表现(se_日期: Series, n: int):
    return calculate_date_scores(se_日期, 50)


class 实践报告(DbBasic):
    # 类属性（所有实例共享）
    __BASE_SCORE = 44

    def __init__(self):
        super().__init__(DB_FILE, STU_NAME_SHEET_FILE)

        self.filenames: Series = pd.Series(dtype=str)
        self.ids = pd.Series(dtype=int)
        self.names = pd.Series(dtype=str)

        self.stu_list: DataFrame = pd.DataFrame(columns=['学号', '姓名'])
        self.commited_list: DataFrame = pd.DataFrame(columns=['学号', '姓名', '日期', '实践表现'])
        self.all_list: DataFrame = pd.DataFrame(columns=['学号', '姓名', '日期', '实践表现'])

    def get_filenames(self):
        se_filenames = self.get_filenames_in_folder(FOLDER_PATH, FILE_TYPES)

        self.check_filenames_format(se_filenames, PATTERN_报告)
        self.check_filenames_duplicates(se_filenames)

        return se_filenames

    def get(self) -> DataFrame:
        logging.debug("统计已提交的学生记录")

        if not self.commited_list.empty:
            return self.commited_list

        query = """
            SELECT 
                学生名单.学号, 
                学生名单.姓名, 
                学生名单.班级, 
                报告提交.日期 
            FROM 学生名单
            LEFT JOIN 报告提交 
                ON 学生名单.学号 = 报告提交.学号
        """

        # 将结果转换为列表（便于转换为DataFrame）
        results = list(self.db.query(query))

        # 转换为pandas DataFrame
        if results:
            df = pd.DataFrame(results)
            # print("左外连接结果：")
            # print(df)
        else:
            # print("连接结果为空")
            df = pd.DataFrame()  # 返回空DataFrame


        # 可以对DataFrame进行进一步处理
        # 例如：查看未提交报告的学生（日期为空）
        if not df.empty:
            unsubmitted = df[df['日期'].isna()]
            print("\n未提交报告的学生：")
            print(unsubmitted[['学号', '姓名', '班级']])

        # region 实践表现（满分30分）
        df['实践表现'] = calc_实践表现(df['日期'], self.__BASE_SCORE)
        # endregion

        # region 设计报告（满分50分）
        # endregion

        self.commited_list = df

        return self.commited_list


if __name__ == "__main__":
    # df_学生_信息 = get_学生_信息()

    报告 = 实践报告()
    # 报告.get_stu_name_sheet()
    # print(报告.get_filenames())
    # se = 报告.get_commited_list()
    # print(se)

    df = 报告.get()
    print(df)

    # min = df['实践表现'].min()
    # df['实践表现'] = df['实践表现'].fillna(min-1)
    # print(df)

    # df.to_excel(OUTPUT_FILE, index=False)
    # print(f"✅ 数据合并完成! 文件已保存至: {OUTPUT_FILE}")
